package com.dingup.api.Util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * Created by wancheng on 2018/7/30.
 */
public class DateUtil {

    public static final String PK_LIST_TIME_PATTERN = "MM月dd日 HH:mm";
    private static final String DEFAULT_PATTERN = "yyyy-MM-dd HH:mm:ss";
    private static final String TIME_YEAR = "yyyy";
    private static final String TIME_MONEN = "MM";
    private static final String TIME_DAY = "dd";
    private static final String TIME_HOUR = "HH";
    private static final String TIME_MIN = "mm";
    private static final String TIME_SEC = "ss";
    private static final String PK_TIME_PATTERN = "yyyy.MM.dd";
    private static final String FORMAT_WEEK = "E";
    /**
     * 日期格式化字符串
     */
    public static String DATE_FORMAT_STR2 = "yyyy-MM-dd HH:mm";
    /**
     * 只显示小时分钟字符串
     */
    public static String ONLY_TIME_FORMAT_STR = "HH:mm";
    private static Map<String, String> WEEK_DAY_MAP = null;

    static {
        WEEK_DAY_MAP = new HashMap<>();
        WEEK_DAY_MAP.put("Sun", "星期日");
        WEEK_DAY_MAP.put("Mon", "星期一");
        WEEK_DAY_MAP.put("Tue", "星期二");
        WEEK_DAY_MAP.put("Wed", "星期三");
        WEEK_DAY_MAP.put("Thu", "星期四");
        WEEK_DAY_MAP.put("Fri", "星期五");
        WEEK_DAY_MAP.put("Sat", "星期六");
    }

    public static String getDate(String interval, Date starttime, String pattern) {
        Calendar temp = Calendar.getInstance(TimeZone.getDefault());
        temp.setTime(starttime);
        temp.add(temp.MONTH, Integer.parseInt(interval));
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        return sdf.format(temp.getTime());
    }

    public static Date getDate(Long milliseconds)
    {
        return new Date(milliseconds);
    }

    /**
     * 将字符串类型转换为时间类型
     *
     * @return
     */
    public static Date str2Date(String str) {
        Date d = null;
        SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_PATTERN);
        try {
            d = sdf.parse(str);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return d;
    }

    public static Date str2Date(String str, String pattern) {
        Date d = null;
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        try {
            d = sdf.parse(str);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return d;
    }

    /**
     * 将时间格式化
     *
     * @return
     */
    public static Date DatePattern(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_PATTERN);
        try {
            String dd = sdf.format(date);
            date = str2Date(dd);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     * 将时间格式化
     */
    public static Date DatePattern(Date date, String pattern) {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        try {
            String dd = sdf.format(date);
            date = str2Date(dd, pattern);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return date;
    }

    public static String date2Str(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_PATTERN);
        return sdf.format(date);
    }

    public static String date2Str(Date date, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }

    /**
     * 获取昨天
     *
     * @param date
     * @return
     * @throws Exception
     */
    public static Date getLastDate(Date date) {
        Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
        calendar.setTime(date);
        calendar.add(calendar.DATE, -1);
        return str2Date(date2Str(calendar.getTime()));
    }

    public static String getLastDateByFormate(Date date,String format) {
        Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
        calendar.setTime(date);
        calendar.add(calendar.DATE, -1);
        return date2Str(calendar.getTime(),format);
    }

    /**
     * 获取前几天
     *
     * @param date
     * @return
     */
    public static Date getBeforeDate(Date date, int dates) {
        Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
        calendar.setTime(date);
        calendar.add(calendar.DATE, -dates);
        return str2Date(date2Str(calendar.getTime()));
    }

    /**
     * 获取上周第一天（周一）
     *
     * @param date
     * @return
     * @throws Exception
     */
    public static Date getLastWeekStart(Date date) {
        Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
        calendar.setTime(date);
        int i = calendar.get(calendar.DAY_OF_WEEK) - 1;
        int startnum = 0;
        if (i == 0) {
            startnum = 7 + 6;
        } else {
            startnum = 7 + i - 1;
        }
        calendar.add(calendar.DATE, -startnum);
        return str2Date(date2Str(calendar.getTime()));
    }

    public static String getWeekStart(String date) {
        Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
        Date date1 = DateUtil.str2Date(date, "yyyy-MM-dd");// 起始时间
        calendar.setTime(date1);
        int i = calendar.get(calendar.DAY_OF_WEEK) - 1;
        int startnum = 0;
        if (i == 0) {
            startnum = 6;
        } else {
            startnum = i - 1;
        }
        calendar.add(calendar.DATE, -startnum);
        return date2Str(calendar.getTime());
    }

    public static String getWeekEnd(String date) {
        Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
        Date date1 = DateUtil.str2Date(date, "yyyy-MM-dd");// 起始时间
        calendar.setTime(date1);
        int i = calendar.get(calendar.DAY_OF_WEEK) - 1;
        int endnum = 0;
        if (i == 0) {
            endnum = 0;
        } else {
            endnum = i + 7;
        }
        calendar.add(calendar.DATE, -(endnum - 1));
        return date2Str(calendar.getTime());
    }

    /**
     * 获取上周最后一天（周末）
     *
     * @param date
     * @return
     * @throws Exception
     */
    public static Date getLastWeekEnd(Date date) {
        Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
        calendar.setTime(date);
        int i = calendar.get(calendar.DAY_OF_WEEK) - 1;
        int endnum = 0;
        if (i == 0) {
            endnum = 7;
        } else {
            endnum = i;
        }
        calendar.add(calendar.DATE, -(endnum - 1));
        return str2Date(date2Str(calendar.getTime()));
    }

    /**
     * 根据年和月得到天数
     *
     * @param num  月
     * @param year 年
     * @return
     */
    public static int getday(int num, int year) {
        if (num == 1 || num == 3 || num == 5 || num == 7 || num == 8 || num == 10 || num == 12) {
            return 31;
        } else if (num == 2) {
            if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
                return 29;
            } else {
                return 28;
            }

        } else {
            return 30;
        }
    }

    /*
     * 计算当前日期距离下个月还有多少天
     */
    public static int getdaymis(Date time) {
        int year = Integer.parseInt(new SimpleDateFormat(TIME_YEAR).format(time));// 年

        int mm = Integer.parseInt(new SimpleDateFormat(TIME_MONEN).format(time));// 月

        int dd = Integer.parseInt(new SimpleDateFormat(TIME_DAY).format(time));// 日

        // 获取当前年月的总天数
        int sdd = getday(mm, year);

        return sdd - dd;

    }

    /**
     * 日期转秒数
     *
     * @param dateString
     * @return
     */
    public static long getTime(String dateString) {
        long time = 0;
        try {
            Date ret = null;
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            ret = sdf.parse(dateString);
            time = ret.getTime() / 1000;
        } catch (Exception e) {

        }
        return time;
    }

    /**
     * 精确计算时间差，精确到日
     *
     * @param fistill 起始日期
     * @param nowtime 结束日期
     * @param type    type为1返回年月日（如：2年3个月零5天） 否则返回总的天数
     * @return
     */
    public static String patienage(Date fistill, Date nowtime, Integer type) {

        int fyear = Integer.parseInt(new SimpleDateFormat(TIME_YEAR).format(fistill));// 起始年

        int fmm = Integer.parseInt(new SimpleDateFormat(TIME_MONEN).format(fistill));// 起始月

        int fdd = Integer.parseInt(new SimpleDateFormat(TIME_DAY).format(fistill));// 起始日

        int nyear = Integer.parseInt(new SimpleDateFormat(TIME_YEAR).format(nowtime));// 结束年

        int nmm = Integer.parseInt(new SimpleDateFormat(TIME_MONEN).format(nowtime));// 结束月

        int ndd = Integer.parseInt(new SimpleDateFormat(TIME_DAY).format(nowtime));// 结束日

        int cyear = nyear - fyear;
        int cmm = nmm - fmm;
        int cdd = ndd - fdd;

        int zyear = 0;
        int zmm = 0;
        int zdd = 0;

        int countddd = 0; // 年月日累计天数

        if (cdd < 0) {
            if (cmm < 0) {
                zyear = cyear - 1;
                zmm = (cmm + 12) - 1;
                int dd = getday(zmm, nyear - 1);
                zdd = dd + cdd;

                countddd = zyear * 365 + zmm * 30 + zdd;

            } else if (cmm == 0) {
                zyear = cyear - 1;
                zmm = 12 - 1;
                int dd = getday(zmm, nyear - 1);
                zdd = dd + cdd;

                countddd = zyear * 365 + zmm * 30 + zdd;

            } else {
                zyear = cyear;
                zmm = cmm - 1;
                int dd = getday(zmm, nyear);
                zdd = dd + cdd;

                countddd = zyear * 365 + zmm * 30 + zdd;

            }
        } else if (cdd == 0) {
            if (cmm < 0) {
                zyear = cyear - 1;
                zmm = cmm + 12;
                zdd = 0;

                countddd = zyear * 365 + zmm * 30;

            } else if (cmm == 0) {
                zyear = cyear;
                zmm = 0;
                zdd = 0;

                countddd = zyear * 365 + zmm * 30;

            } else {
                zyear = cyear;
                zmm = cmm;
                zdd = 0;

                countddd = zyear * 365 + zmm * 30;
            }
        } else {
            if (cmm < 0) {
                zyear = cyear - 1;
                zmm = cmm + 12;
                zdd = cdd;

                countddd = zyear * 365 + zmm * 30 + zdd;
            } else if (cmm == 0) {
                zyear = cyear;
                zmm = 0;
                zdd = cdd;

                countddd = zyear * 365 + zmm * 30 + zdd;
            } else {
                zyear = cyear;
                zmm = cmm;
                zdd = cdd;

                countddd = zyear * 365 + zmm * 30 + zdd;
            }
        }
        String ptime = null;

        if (zdd != 0) {
            if (zmm != 0) {
                if (zyear != 0) {
                    ptime = zyear + "年" + zmm + "个月" + "零" + zdd + "天";
                } else {
                    ptime = zmm + "个月" + "零" + zdd + "天";
                }
            } else {
                if (zyear != 0) {
                    ptime = zyear + "年" + "零" + zdd + "天";
                } else {
                    ptime = zdd + "天";
                }
            }
        } else {
            if (zmm != 0) {
                if (zyear != 0) {
                    ptime = zyear + "年" + zmm + "个月";
                } else {
                    ptime = zmm + "个月";
                }
            } else {
                if (zyear != 0) {
                    ptime = zyear + "年";
                } else {
                    ptime = null;
                }
            }
        }
        if (type == 1) {
            return ptime; // 返回年月日（如：2年3个月零5天）
        } else {
            return String.valueOf(countddd); // 返回总天数
        }

    }

    /**
     * 得到月数
     *
     * @param year  年数差
     * @param month 月数差
     * @return
     */
    public static int getCmm(Integer year, Integer month) {
        int zmm = 0;
        if (month < 0) {
            zmm = (month + 12) + (year - 1) * 12;
        } else if (month == 0) {
            zmm = year * 12;
        } else {
            zmm = year * 12 + month;
        }
        return zmm;
    }

    /**
     * 改更现在时间
     */
    public static Date changeDate(String type, int value) {
        Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
        if (type.equals("month")) {
            calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + value);
        } else if (type.equals("date")) {
            calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) + value);
        }
        return calendar.getTime();
    }

    /**
     * 更改时间
     */
    public static Date changeDate(Date date, String type, int value) {
        if (date != null) {
            // Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
            Calendar calendar = new GregorianCalendar();
            calendar.setTime(date);
            // Calendar calendar = Calendar.
            if (type.equals("month")) {
                calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + value);
            } else if (type.equals("date")) {
                calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) + value);
            } else if (type.endsWith("year")) {
                calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) + value);
            }
            return calendar.getTime();
        }
        return null;
    }

    /**
     * 比较时间是否在这两个时间点之间
     *
     * @param time1
     * @param time2
     * @return
     */
    public static boolean checkTime(String time1, String time2) {
        Calendar calendar = Calendar.getInstance();
        Date date1 = calendar.getTime();
        Date date11 = DateUtil.str2Date(DateUtil.date2Str(date1, "yyyy-MM-dd") + " " + time1);// 起始时间
        Calendar c = Calendar.getInstance();
        c.add(Calendar.DATE, 1);
        Date date2 = c.getTime();
        Date date22 = DateUtil.str2Date(DateUtil.date2Str(date2, "yyyy-MM-dd") + " " + time2);// 终止时间
        Calendar scalendar = Calendar.getInstance();
        scalendar.setTime(date11);// 起始时间
        Calendar ecalendar = Calendar.getInstance();
        ecalendar.setTime(date22);// 终止时间
        Calendar calendarnow = Calendar.getInstance();
        if (calendarnow.after(scalendar) && calendarnow.before(ecalendar)) {
            return true;
        } else {
            return false;
        }
    }

    public static String getTime90Min() {
        Calendar calendar = Calendar.getInstance();
        System.out.println(date2Str(calendar.getTime()));
        calendar.add(Calendar.HOUR, 1);
        calendar.add(Calendar.MINUTE, 30);
        Date date2 = calendar.getTime();
        System.out.println(date2Str(calendar.getTime()));
        return date2Str(date2);
    }

    public static String getTime1day() {
        Calendar calendar = Calendar.getInstance();
        System.out.println(date2Str(calendar.getTime()));
        calendar.add(Calendar.DAY_OF_MONTH, 1);
        //calendar.add(Calendar.MINUTE, 30);
        Date date2 = calendar.getTime();
        System.out.println(date2Str(calendar.getTime()));
        return date2Str(date2);
    }


    /**
     * haoxw 比较时间是否在这两个时间点之间
     *
     * @param date11
     * @param date22
     * @return
     */
    public static boolean checkTime(Date date11, Date date22) {

        Calendar scalendar = Calendar.getInstance();
        scalendar.setTime(date11);// 起始时间
        Calendar ecalendar = Calendar.getInstance();
        ecalendar.setTime(date22);// 终止时间
        Calendar calendarnow = Calendar.getInstance();
        if (calendarnow.after(scalendar) && calendarnow.before(ecalendar)) {
            return true;
        } else {
            return false;
        }
    }

    public static Integer time(Date before, Date end) {// 终止时间
        Calendar scalendar = Calendar.getInstance();
        scalendar.setTime(before);// 起始时间
        Calendar ecalendar = Calendar.getInstance();
        ecalendar.setTime(end);// 终止时间
        long ss = scalendar.getTimeInMillis();// 日
        long ee = ecalendar.getTimeInMillis();// 日
        int cc = (int) (ee - ss);
        return cc;
    }



    public static String Datebynow() {
        String d = date2Str(new Date());
        return d;
    }



    /**
     * 获取interval天之前的日期
     *
     * @param interval
     * @param starttime
     * @param pattern
     * @return
     */
    public static Date getIntervalDate(String interval, Date starttime, String pattern) {
        Calendar temp = Calendar.getInstance();
        temp.setTime(starttime);
        temp.add(temp.DATE, Integer.parseInt(interval));
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        String shijian = sdf.format(temp.getTime());
        return str2Date(shijian);
    }

    public static Date formatDate(Date date) {
        SimpleDateFormat bartDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println(bartDateFormat.format(date));
        SimpleDateFormat bartDateFormat1 = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date date1 = bartDateFormat1.parse(bartDateFormat.format(date));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.println(date.getTime());
        return date;
    }

    public static String dateToStringForPk(Date date){
       return date2Str(date,PK_TIME_PATTERN);
    }

    public static String dateToStringForPkList(Date date){
        return date2Str(date,PK_LIST_TIME_PATTERN);
    }


    public static String getDTS(Date date) {
        DateFormat df = new SimpleDateFormat(DATE_FORMAT_STR2);
        return df.format(date);
    }

    /**
     * 格式化时间字符串
     * 形如：“12:11”
     *
     * @param date 时间实例
     * @return 时间字符串
     */
    public static String getOnlyTimeFormatStr(Date date) {
        DateFormat df = new SimpleDateFormat(ONLY_TIME_FORMAT_STR);
        return df.format(date);
    }

    /**
     * 返回星期
     *
     * @param date
     * @return
     */
    public static String getFormatWeek(Date date) {
        String weekDay = date2Str(date, FORMAT_WEEK);
        if (WEEK_DAY_MAP.get(weekDay) != null) {
            return WEEK_DAY_MAP.get(weekDay);
        }
        return weekDay;
    }
}
